#!/bin/bash

:<<memoName

和其他编程语言一样，Shell 也支持数组。数组（Array）是若干数据的集合，
其中的每一份数据都称为元素（Element）。
Shell 并且没有限制数组的大小，理论上可以存放无限量的数据。
和 C++、Java、C# 等类似，Shell 数组元素的下标也是从 0 开始计数。
获取数组中的元素要使用下标[ ]，下标可以是一个整数，
也可以是一个结果为整数的表达式；当然，下标必须大于等于 0。
遗憾的是，常用的 Bash Shell 只支持一维数组，不支持多维数组。

Shell 数组的定义
	在 Shell 中，用括号( )来表示数组，
	数组元素之间用空格来分隔，必须以"空格"来隔开，这是其基本要求。
	由此，定义数组的一般形式为：
		array_name=(ele1  ele2  ele3 ... elen)
	注意，赋值号=两边不能有空格，必须紧挨着数组名和数组元素。
	下面是一个定义数组的实例：
		nums=(29 100 13 8 91 44)
	Shell 是弱类型的，它并不要求所有数组元素的类型必须相同，例如：
		arr=(20 56 "http://c.biancheng.net/shell/")
	第三个元素就是一个“异类”，前面两个元素都是整数，而第三个元素是字符串。
	Shell 数组的长度不是固定的，定义之后还可以增加元素。例如，对于上面的 nums 数组，它的长度是 6，使用下面的代码会在最后增加一个元素，使其长度扩展到 7：
		nums[6]=88
	此外，你也无需逐个元素地给数组赋值，下面的代码就是只给特定元素赋值：
		ages=([3]=24 [5]=19 [10]=12)
	以上代码就只给第 3、5、10 个元素赋值，所以数组长度是 3。

		# 可以这样定义
		array=( one two three )
		echo ${array[@]}

		# 也可以这样定义
		array=(
			one
			two
			three
		)
		echo ${array[@]}

		# 还可以这样定义
		array[0]=one
		array[1]=two
		array[2]=three
		echo ${array[@]}

数组添加
	向Shell数组添加元素有多种方法，每种方法在使用时都有一些需要注意的地方，没有见过这方面的总结资料，所以自己总结一下。
	直接下标添加
			array_name[index]=value
		最简单的添加方式，直接用下标index为数组元素赋值，在使用时需要注意的是就是需要确保下标index处原本是没有值的，否则会替换index处原本的值。

	数组长度添加
			array_name[${#array_name[@]}]=value
			#或array_name[${#array_name[*]}]=value
		以数组长度为下标添加，每次只能增加一个元素。但此方法有一个前提，就是数组中的元素下标必须是连续的，否则会存在替换已有元素的风险。例如：
				arr=([1]="a" [2]="b")
				echo ${arr[@]}
				arr[${#arr[@]}]="c"
				echo ${arr[@]}
			实际上并没有添加元素，而是将下标为2的元素值“b”替换为了“c”。
	
	重新创建数组
		array_name=("${array_name[@]}" value1 ... valueN)
		这种方式不需要下标连续，可同时添加多个元素，但是有一些要注意的地方：
		首先，使用此方式添加元素后，数组中原有元素的下标会重置，会从0开始变成连续的，如果不希望改变下标则不能使用这种方式。
		其次，双引号不能省略，否则，当数组array_name中存在包含空格的元素时会按空格将元素拆分成多个。
		最后，不能将“@”替换为“*”，虽然在输出数组元素时可以相互替换，
		如果替换为“*”，不加双引号时与“@”的表现一致，加双引号时，
		会将数组array_name中的所有元素作为一个元素添加到数组中。类似于特殊变量$@和$*的区别。
			arr1=()
			initArray(){
				arr1=([2]="a b" [3]=2 [5]=4)
			}
			showArray(){
				echo "Elements in arr1: ${arr1[@]}"
				echo "Length of arr1: ${#arr1[@]}"
				echo "The 3rd elements is: ${arr1[2]}"
				echo
			}
			initArray
			echo "original arr1:"
			showArray
			echo "add new elements 3 and 5"
			echo "--------------------"
			echo "use @ without quote"
			arr1=(${arr1[@]} 3 5)
			showArray
			initArray
			echo "use * without quote"
			arr1=(${arr1[*]} 3 5)
			showArray
			initArray
			echo "use @ with quote"
			arr1=("${arr1[@]}" 3 5)
			showArray
			initArray
			echo "use * with quote"
			arr1=("${arr1[*]}" 3 5)
			showArray
		运行结果为：
			original arr1:
			Elements in arr1: a b 2 4
			Length of arr1: 3
			The 3rd elements is: a b
			 
			add new elements 3 and 5
			--------------------
			use @ without quote
			Elements in arr1: a b 2 4 3 5
			Length of arr1: 6
			The 3rd elements is: 2
			 
			use * without quote
			Elements in arr1: a b 2 4 3 5
			Length of arr1: 6
			The 3rd elements is: 2
			 
			use @ with quote
			Elements in arr1: a b 2 4 3 5
			Length of arr1: 5
			The 3rd elements is: 4
			 
			use * with quote
			Elements in arr1: a b 2 4 3 5
			Length of arr1: 3
			The 3rd elements is: 5
	赋值运算符+=
		array_name+=(value1 ... valueN)
		这种方式不需要元素下标连续，可以添加多个元素，添加后元素下标不会重置，
		不存在元素覆盖的风险。唯一要注意的就是“+=”前后不能有空格，
		并且后面的待添加元素必须用“()”包围起来，并且多个元素用空格分隔。
		新添加的元素的下标取决于原本数组中最后有值的元素的下标。
			arr1=()
			initArray(){
				arr1=([2]="a b" [3]=2 [5]=4)
			}
			showArray(){
				echo "Elements in arr1: ${arr1[@]}"
				echo "Length of arr1: ${#arr1[@]}"
				echo "The 3rd elements is: ${arr1[2]}"
				echo
			}
			initArray
			echo "original arr1:"
			showArray
			echo "add new elements 3 and 5"
			echo "--------------------"
			echo "use += "
			arr1+=(3 5)
			showArray
			echo "The 8th elements is: ${arr1[7]}"

		运行结果为：
			original arr1:
			Elements in arr1: a b 2 4
			Length of arr1: 3
			The 3rd elements is: a b
			 
			add new elements 3 and 5
			--------------------
			use += 
			Elements in arr1: a b 2 4 3 5
			Length of arr1: 5
			The 3rd elements is: a b
			 
			The 8th elements is: 5
		数组中原本的元素没有改变，新添加的元素下标是在最后有值的元素下标5的基础上递增的。
总结

添加方式	     	语法 										可添加多个元素 下标必须连续	添加后下标改变	 可能覆盖原有元素

直接下标添加	 array_name[index]=value							否			否			否			是

数组长度添加	array_name[${#array_name[@]}]=value					否			是			否			是
			或array_name[${#array_name[*]}]=value				

重新创建数组	array_name=("${array_name[@]}" value1 ... valueN)	是			否			是			否

赋值运算符+=	array_name+=(value1 ... valueN)						是			是			是			否








获取数组元素
	获取数组元素的值，一般使用下面的格式：
		${array_name[index]}
	其中，array_name 是数组名，index 是下标。例如：
		n=${nums[2]}
	表示获取 nums 数组的第二个元素，然后赋值给变量 n。再如：
		echo ${nums[3]}
	表示输出 nums 数组的第 3 个元素。
	使用@或*可以获取数组中的所有元素，例如：
		${nums[*]}
		${nums[@]}
	两者都可以得到 nums 数组的所有元素。
		array=( one two three )
		echo "第一个元素为: ${array[0]}"
		echo "第二个元素为: ${array[1]}"
		echo "第三个元素为: ${array[2]}"
遍历数组
	通过数组下标来遍历数组:
		array=( one two three )
		for i in ${!array[@]}
		do
			echo ${array[i]}
		done
	直接遍历数组
		array=( one two three )
		for i in ${array[@]}
		do
			echo $i
		done

删除数组中的元素,unset array[index] , 此处有坑要填
	array=( one two three )
	echo ${array[@]}
	unset array[0]
	echo ${array[@]}
	echo "数组大小为 : ${#array[@]}"
	输出结果为 :
		one two three
		two three
		数组大小为 : 2
	既然数组大小为2,打印下数组位置为 0 的元素 :
		array=( one two three )
		echo ${array[@]}
		unset array[0]
		echo ${array[@]}
		echo "数组大小为 : ${#array[@]}"

		echo "数组下标为 0 的元素  ${array[0]}"
		for i in ${!array[@]}
		do
				echo "数组下标为 $i"
		done
	结果为下 :
		one two three
		two three
		数组大小为 : 2
		数组下标为 0 的元素  # 不是 two 哦
		数组下标为 1         # 数组下标不是从 0 开始的哦
		数组下标为 2
	因此我一般删除元素后
		array=( one two three )
		echo ${array[@]}
		unset array[0]
		array=("${array[@]}")  #  新加的一行
		echo ${array[@]}
		echo "数组大小为 : ${#array[@]}"

		echo "数组下标为 0 的元素  ${array[0]}"
		for i in ${!array[@]}
		do
				echo "数组下标为 $i"
		done
	结果为:
		one two three
		two three
		数组大小为 : 2
		数组下标为 0 的元素  two
		数组下标为 0
		数组下标为 1

数组分片: 通用的格式${array[@]:起始位置:长度}，中间以":"隔开，如果第二项省略的话，就取后面所有的项
		array=( one two three  four)
		echo  ${array[@]}     # 输出全部元素: one two three four
		echo  ${array[@]:1}   # 输出从下标为 1 开始的所有元素 : two three four
		echo  ${array[@]:0:2} # 输出从下标为 0 开始到下标为 2 结束的所有元素 : one two
		echo  ${array[@]::2}  # 同上 : one two
		echo  ${array[@]:(-2):1} # 输出从倒数第二个元素算起,取 1 位 : three







完整的演示：

#!/bin/bash

nums=(29 100 13 8 91 44)
echo ${nums[@]}  #输出所有数组元素
nums[10]=66  #给第10个元素赋值（此时会增加数组长度）
echo ${nums[*]}  #输出所有数组元素
echo ${nums[4]}  #输出第4个元素




memoName


pwdDir=`pwd`
logDir="${pwdDir}/elk/logs/"

function ecmptyFileName(){
	for fileName in $( ls $1 ) ; do
		dirFileName="$1"${fileName}
		# echo ${dirFileName}
		if [ -f "${dirFileName}" ] ; then
			echo "=文件=" ${dirFileName}
		else
			echo "-文件夹-" ${dirFileName}
			ecmptyFileName "${dirFileName}/"
		fi
	done

}

ecmptyFileName ${logDir}
